<?php
/**
 * Абстрактный контроллер
 * @since 07.11.2011
 * @author Akulov Denis <akulov.d.g@gmail.com>
 */
abstract class K_MVC_Controller_Abstract {

    /**
    * @var K_Container_OnlyRead
    */
    private $_container = null;


    /**
     * @var K_MVC_View_Container
     */
    private $_view = null;


    /**
     * @return K_Container_OnlyRead
     */
    protected function _getContainer () {
        return $this->_container;
    }


    /**
    * @return K_GlobalContext
    */
    protected function _getGc () {
        return $this->_container->get('global_context');
    }


    /**
     * @param K_MVC_View_Container $viewContainer
     */
    public function _setViewContainer (K_MVC_View_Container $viewContainer) {
        if (is_null($this->_view)) {
            $this->_view = $viewContainer;

            return ;
        }
    }


    /**
     * @return K_MVC_View_Container
     */
    protected function _getViewContainer () {
        return $this->_view;
    }


    /**
     * @param K_Container_OnlyRead $container
     */
    public function _setContainer (K_Container_OnlyRead $container) {
        if (is_null($this->_container)) {
            $this->_container = $container;

            return ;
        }

        throw new Exception('Link to container already exists');
    }


    /**
     * @param string $configName
     * @return mix
     */
    protected function _getConfig ($configName) {
        return $this->_container->get('CONFIG')->getConfig($configName);
    }


    /**
    * @return K_Config
    */
    protected function _getConfigItem ($configName ,$atributeName) {
        return $this->_container->get('CONFIG')->getAttribute($configName, $atributeName);
    }


    /**
     * @param string $modelName
     * @return K_MVC_Model_Base
     */
    protected function _getInstanceModel ($modelName, array $params = array()) {
        if (!$this->_getGc()->isExists($modelName)) {
            $this->_getGc()->set($modelName, $this->_createModel($modelName, $params));
        }

        return $this->_getGc()->get($modelName);
    }


    protected function _createModel($modelName, array $params = array()) {
        return $this->_container->get('factory_models')->factory($modelName, $params);
    }


    /**
     * @param string $name
     * @return K_Logger_Item
     */
    protected function _getLogger ($name) {
        return $this->_getContainer()->get('logger')->getInstance($name);
    }


    /**
     * Возвращает html-код сгенерированый MVC/VC - узла
     * @return string(html)
     */
    public function _render () {
        return $this->_view->render();
    }


    /**
     * @return K_MVC_View_Element
     */
    protected function _newViewElement ($viewName) {
        return $this->_view->addView($viewName);
    }


    /**
     * Очищает контейнер представлений
     */
    public function _cleanViewContainer () {
        $this->_getViewContainer()->clean();
    }


    /**
     * Точка выхода в нереализованном методе.
     * @param string $method
     */
    protected function _notNotImplamented ($method) {
        die('Not implamented: '.$method);
    }


    /**
     * Оброботчик события, когда нет доступа к узлу контроллера
     * @param string $methodName
     * @param array $params
     */
    abstract public function _accessDeniedHandler ($methodName, array $params);


    /**
     * Переход по ссылки
     * @param string $location
     */
    abstract protected function _redirect ($location);

}